package com.example;

import javafx.application.Platform;
import javafx.scene.image.WritableImage;
import javafx.scene.layout.Background;
import javafx.scene.layout.BackgroundImage;
import javafx.scene.layout.BackgroundPosition;
import javafx.scene.layout.BackgroundRepeat;
import javafx.scene.layout.BackgroundSize;
import javafx.scene.robot.Robot;
import javafx.stage.Stage;

import java.awt.AWTException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**
 * <p>裁剪实现</p>
 *
 * @author dc
 * @date 2025-09-05
 **/
public class CutAction implements ActionListener {
    private final PaneManager paneManager;
    private final Stage primaryStage;

    private WritableImage fullScreenShot;

    /**
     * 截图逻辑
     *
     * @param primaryStage 主窗口
     * @param paneManager  窗体管理器
     */
    public CutAction(Stage primaryStage, PaneManager paneManager) {
        this.primaryStage = primaryStage;
        this.paneManager = paneManager;
    }

    /**
     * 捕获全屏截图，必须被javafx线程执行
     * scene.screenshot只会抓取窗口截图，所以这里用javafx的robot获取全屏截图
     */
    private WritableImage captureScreen() throws AWTException {
        // 使用Robot类截取屏幕
        Robot robot = new Robot();
        // 这里需要设置scaleToFit为 false 以捕获实际的物理分辨率，即CaptureProperty.screenWidth * scaleFactor
        // 如果设置scaleToFit为 true ，则会缩放图片以适应屏幕分辨率，这个过程会导致图片模糊，暂时未知原因
        // 猜测是截全屏(1920x1080)后，将图像缩到了逻辑分辨率，导致图片像素丢失，然后又显示在逻辑屏幕上导致模糊
        // 设为 false 后清晰，估计是由系统直接展示1920x1080像素的图片，故而能清晰展示
        return robot.getScreenCapture(null, 0, 0, CaptureProperty.screenWidth, CaptureProperty.screenHeight, false);
    }
    
    @Override
    public void actionPerformed(ActionEvent e) {
        Platform.runLater(() -> {
            // 首先获取屏幕截图
            try {
                fullScreenShot = captureScreen();
            } catch (AWTException ex) {
                ex.printStackTrace();
            }
            // 因为图片是全屏的，所以保持比例和覆盖填充只需要有一个为true便可清晰展示，如果都为false，会因为屏幕逻辑分辨率较小，会导致图片显示不全
            BackgroundSize backgroundSize = new BackgroundSize(
                    BackgroundSize.AUTO,  // 宽度=原始尺寸
                    BackgroundSize.AUTO,  // 高度=原始尺寸
                    false,                // 非百分比模式
                    false,                // 非百分比模式
                    true,                // 保持比例（原样显示）
                    false                 // 不覆盖填充
            );
            Background background = new Background(new BackgroundImage(fullScreenShot,
                    BackgroundRepeat.NO_REPEAT,
                    BackgroundRepeat.NO_REPEAT,
                    BackgroundPosition.DEFAULT,
                    backgroundSize));
            // 设置背景为屏幕截图
            paneManager.getRootPane().setBackground(background);
            // 显示一个全屏遮罩
            paneManager.getMaskManager().updateMaskWithHole(0, 0, 0, 0);
            paneManager.getToolbarManager().setFullScreenShot(fullScreenShot);
            paneManager.getCaptureStage().show();
            // 让窗口置前，避免被任务栏遮蔽
            // toFront和requestFocus都不一定能让窗口获得焦点并置顶
            // 副窗口的toFront效果受主窗口的置顶状态影响，所以这里要调用两次，同时使用焦点和置前来确保窗口置顶
            primaryStage.requestFocus();
            paneManager.getCaptureStage().requestFocus();
            primaryStage.toFront();
            paneManager.getCaptureStage().toFront();
        });
    }
    
}
